﻿\section{Projekt implementacji}

\subsection{Model systemu}

Nasz system (\ref{fig:model_systemu}) składa się z:
\begin {itemize}
\item bota internetowego, pobierającego dane w sposób automatyczny
\item aplikacji matlabowej przetwarzającej zgromadzone dane.
\end{itemize}
Dane o publikacjach, patentach, zainteresowaniach pobierane są z sieci Internet z wybranych serwerów. Niektóre dane zostały pozyskane manualnie. Po wstępnym przetworzeniu dane gromadzone są w bazie wiedzy, wykorzystywanej przez moduł główny aplikacji.

W module głównym wykonywana jest weryfikacja i selekcja danych do użycia ich do obliczeń prognoz. Po wstępnej ocenie generowane są wzory empiryczne na wartości zmiennych opisywanych zależnych od zmiennych opisujących. Z otrzymanych wzorów tworzone są prognozy, a na ich podstawie generowane są raporty, które znajdą się w rozdziale \ref{cha:wyniki}.

\begin{center}
\begin{figure}[h]
\centerline{\includegraphics[scale=1]{model_systemu}}
\caption{Diagram modelu systemu i przepływu danych}
\label{fig:model_systemu}
\end{figure}
\end{center}

\subsection{Implementacja}
Projekt zaimplementowany został z użyciem technologii i języków:
\begin {itemize}
\item Java
\item Matlab
\end{itemize}
W przetwarzaniu informacji przydatne okazały się technologie skryptowe języków Python, Perl, Bash, w tym wyrażenia regularne.

\subsection{Import danych}

Dane wczytywane są do programu przy wykorzystaniu serwera komunikacyjnego COM opracowanego przez firmę Microsoft wbudowanego w program Microsoft Office.

Matlab przy wykorzystaniu funkcji xlsread łączy się z wyżej wymienionym serwerem stając się w stosunku do niego klientem i odbiera odczytane przez niego dane.

Serwer COM zwraca dane w postaci obiektu posiadającego dwa pola; nagłówek, dane, zgodnie z filozofią bazy danych dla Microsoft Excel:
\begin {itemize}
\item nagłówek: typ tekstowy, dane nierozdzielne pustą kolumną, koniec nagłówka poprzez rozpoczęcie danych liczbowych,
\item dane: typy liczbowe zdefiniowane przez arkusz programu Excel, dane nierozdzielne pustą kolumną, koniec danych sygnalizuje pusty wiersz.
Powyższe zastrzeżenie sprawia, że Matlab tworzy tablicę zawierającą dwa wiersze; tekstową tablicę nagłówka, liczbową tablicę danych.
\end {itemize}

Importując dane tworzona jest tablica wektorów zawierająca wektory będące strukturami zawierającymi następujące pola:
\begin {itemize}
\item nazwa
\item dopełniacz nazwy - pola budowane na podstawie nagłówka arkusza programu Excel
\item typ
\item dopełniacz typu - pola budowane na podstawie nagłówka arkusza programu Excel
\item t - pole przechowujące tablice liczbową będącą podstawą czasową. Pole jest budowane na podstawie pierwszej kolumny arkusza programu Excel
\item x - pole przechowujące tablice liczbową będącą zbiorem danych. Pole jest budowane na podstawie kolejnych kolumn arkusza programu Excel.
\end {itemize}



\subsection{Przetwarzanie i selekcja danych}


Okresem czasu branym pod uwagę przy wyznaczaniu trendów i tworzeniu prognoz były lata 2000 - 2008. Wszystkie szeregi czasowe zostały więc odpowiednio przetworzone aby odpowiadały wybranemu okresowi czasu. Szukane były zależności zarówno liniowe bezpośrednio pomiędzy zmiennymi jak i pomiędzy szeregami utworzonymi z logarytmów wartości zmiennych oraz z funkcji różnicowych. Dane opisujące wskaźniki gospodarcze przyjęte zostały jako zmienne objaśniane, zaś pozostałe dane jako zmienne objaśniające.

Dla każdej pary szeregów: \\
zmienna objaśniana -- zmienna objaśniająca, \\
zmienna objaśniana -- logarytm zmiennej objaśniającej, \\
zmienna objaśniana -- różniczka zmiennej objaśniającej \\
obliczony został współczynnik korelacji liniowej Pearsona. Następnie, w celu wyeliminowania korelacji nieistotnych, przypadkowych przeprowadzony został test t-Studenta istotności korelacji. Ma on służyć zminimalizowaniu ryzyka wystąpienia sytuacji, w której korelacje występujące w analizowanej próbie nie są właściwe dla całej populacji.

Ze względu na stosunkowo niewielkie rozmiary szeregów czasowych test t-Studenta był jedynym możliwym do zastosowania powszechnie używanym testem. Jako graniczne, największe dopuszczalne prawdopodobieństwo, że w całej próbie korelacja jest zerowa przyjęto wartość 0,05. Oznacza to, że poziom ufności ustalony został na 0,95. Korelacje nieistotne na tym poziomie ufności zostały odrzucone jako zerowe.



\subsection{Realizacja metody grafowej doboru zmiennych}
Zmienne określające dla poszczególnych zmiennych określanych dobrano za pomocą metody grafowej. Algorytm przeprowadzono według następujących punktów:
\begin{enumerate}
 \item Dane potrzebne do analizy korelacji zestawiono w formacie akceptowanym przez polecenie matlab-a \verb+corr+.
 \item Uzyskano symetryczną macierz kwadratową zawierającą współczynniki korelacji między każdą parą kandydatek. Dodatkowo utworzono wektor współczynników korelacji z kandydatkami dla każdej zmiennej określanej. W dalszej części został przedstawiony schemat postępowania jednej zmiennej - analogicznie postępowano z każdą zmienną określaną.
 \item Zgodnie z założeniami testu t-Studenta zrezygnowano ze zmiennych, dla których prawdopodobieństwo wpływu na zmienną określaną było mniejsze niż 95\%, co dla próbek liczących 9 pozycji oznaczało wartość krytyczną korelacji ok. 0,66. Filtracji dokonano zerując korelacje dotyczące pomijanej zmiennej zarówno w macierzy współczynników korelacji, jak i w wektorze.
 \item Wszystkie współczynniki korelacji pomiędzy kandydatkami na zmienne określające mniejsze od wartości krytycznej wyzerowano uznając je za nieistotne.
 \item Znaleziono grafy korelacji w macierzy współczynników korelacji stosując kroki:
 \begin{enumerate}
  \item Za pierwszy punkt grafu uznawano jedną z kandydatek skorelowanych ze zmienną określaną, pod warunkiem, że nie należała do jednego z wcześniej znalezionych grafów
  \item Wszystkie analizowane kandydatki dzielono na trzy kategorie – należące do grafu, przeznaczone do włączenia do grafu, oraz przeznaczone do zbadania. Pierwszy punkt uznawano za przeznaczony do włączenia do grafu
  \item \label{enum3} Dla każdej kandydatki przeznaczonej do włączenia do grafu wyszukiwano wszystkie kandydatki z nią skorelowane i zaliczano je do kategorii przeznaczonych do zbadania
  \item Włączano do grafu kandydatki do tego przeznaczone
  \item Kandydatki przeznaczone do zbadania przenoszono do kategorii czekających na włączenie do grafu, ale tylko te, które nie były jeszcze zawarte w grafie (pierwsza kategoria)
  \item Jeśli nie stwierdzono żadnych kandydatek czekających na włączenie do grafu, algorytm zostawał zakończony. W przeciwnym wypadku powracano do punktu \ref{enum3}
 \end{enumerate}
 \item W każdym grafie wybrano kandydatkę posiadającą największą liczbę połączeń. W~przypadku kilku zmiennych o równej ilości połączeń stosowano dodatkowe kryterium w postaci modułu korelacji ze zmienną określaną. Wyselekcjonowaną kandydatkę uznawano za zmienną określającą, która reprezentuje dany graf.
\end{enumerate}

Przedstawioną metodę zastosowano dla ponad dwóch tysięcy kandydatek na zmienne określające, co daje ponad cztery miliony współczynników korelacji tylko pomiędzy kandydatkami. Analiza problemów o podobnych rozmiarach jest możliwa jedynie z wykorzystaniem komputera oraz algorytmów działających w pełni automatycznie.



\subsection{Metody prognostyczne}
Do wykorzystania w module prognostycznym wybrano modele ARMA i ARMAX. Pierwszy z nich składa się części autoregresyjnej (zmienna zależy od własnych wartości w przeszłości) oraz części związanej z zakłóceniami.
\begin{displaymath}
X_t = \varepsilon_t + \sum_{i=1}^{p}\varphi_i X_{t-1} + \sum_{i=1}^{q}\theta_i \varepsilon_{t-1}
\end{displaymath}
Powyższą zależność można zapisać z wykorzystaniem operatora q oznaczającego cofnięcie o pewną ilość dyskretnych jednostek czasu:
\begin{displaymath}
A(q)y(t) = C(q)e(t)
\end{displaymath}
gdzie $A(q), C(q)$ posiadają postać $a_0 + a_1 q^{-1} + a_2 q^{-2} + \cdots + a_n q^{-n}$

Korzystano z niego, aby wyznaczyć trendy pojedynczych zmiennych określających bez uwzględniania zewnętrznego sygnału sterującego. Podczas wyznaczania trendów zmiennych związanych z gospodarką korzystano z modelu ARMAX uwzględniającego zewnętrzne sterowania:
\begin{displaymath}
A(q)y(t) = \sum_{i}B_i(q)u_i(t-n_k) + C(q)e(t)
\end{displaymath}

Prognozowania bez wpływu sterowania zewnętrznego dokonywano za pomocą dwóch metod:
\begin{enumerate}
\item najpierw sporządzano prognozy za pomocą modelu ARMA, wykorzystując funkcję matlab-a \verb+armax+ z parametrami wskazującymi na brak sterowania. Testowano pełny zestaw parametrów członu autoregresyjnego i członu zakłóceń, po czym wybierano model z najmniejszą sumą kwadratów błędów. Kolejnym krokiem było obliczenie prognozy na $n$ lat w przyszłość. Trend musiał posiadać odpowiednią stabilność, tzn. nie rozbiegał się do nieproporcjonalnie dużych wartości. Istniała również możliwość uwzględnienia oceny wizualnej przez człowieka. W przypadku niezadowalających wyników stosowano drugą metodę.
\item Dane, do których zastosowano drugą metodę prognozowania, z reguły odznaczały się dużą niestabilnością. Aby uzyskać prognozę, wykonano następujące kroki:
 \begin{enumerate}
 \item Wektor danych prognozowanych $Y$ przekształcono na $Y' = MY + D$ w taki sposób, aby wektor $Y'$ zawierał tylko wartości dodatnie większe niż 10
 \item przekształcono wektor $Y'$ na $Y''$ za pomocą transformacji $Y''(i) = \ln \frac{Y'(i+1)}{Y'(i)}$
 \item Wykonano prognozowanie analogiczne jak pierwszą metodą dla danych $Y''$
 \item Wartości $Y''$ przekształcono kolejno na $Y'$ i $Y$
 \end{enumerate}
\end{enumerate}

W celu wykonania transformacji użyto funkcji matlab-a \verb+price2ret+ oraz \verb+ret2price+. Nie gwarantują one jednak przesunięcia wartości powyżej zera, dlatego przeskalowanie należy zapewnić samodzielnie.

Podczas prognozowania zmiennych gospodarczych zastosowano model ARMAX w celu podkreślenia wpływu odpowiednich trendów systemów eksperckich. Aby znaleźć model najlepiej opisujący daną zmienną:
\begin{enumerate}
\item przy wyborze zmiennych określających przyjęto konwencję, że dana seria czasowa wartości, wartości zlogarytmowane oraz seria różniczek stanowią trzy osobne kandydatki na zmienne określające, traktowane oddzielnie zarówno podczas obliczania współczynników korelacji, jak i wyboru zmiennych określających. 
\item Rozpatrzono duży zestaw (w granicach dopuszczonych przez liczbę próbek) parametrów $na, nb, nc$ oznaczających odpowiednio liczbę współczynników w wielomianach $A(q), B(q), C(q)$
\item zrezygnowano z zastosowania transformacji logarytmicznej za pomocą funkcji \verb+price2ret+, \verb+ret2price+, ponieważ wśród sterowań mogły wystąpić wartości już zlogarytmowane. Wymagałoby to odmiennego traktowania niektórych zmiennych określających oraz potencjalnie mogłoby zwiększyć błąd prognoz.
\end{enumerate}

Wzrost liczby współczynników badanego modelu bardzo często powoduje zmniejszenie błędu, również wtedy, gdy nie pociąga to za sobą
poprawy jakości modelu. Powiększanie stopnia wielomianu aproksymującego dla skończonej liczby próbek powoduje stopniowe pomniejszanie błędu,
aż do osiągnięcia wielomianu interpolacji. Aby minimalizować ten efekt, zastosowano karę zależną od ilości współczynników w modelu:
\begin{displaymath}
f_o(m) = (1 + \frac{p}{100})^{na+nb+nc} \sum_{i=1}^{N} |y_{pred, i}-y_i|
\end{displaymath}
$f_o(m)$ - funkcja oceny modelu $m$\\
$na, nb, nc$ - liczby współczynników wielomianów $A(q), B(q), C(q)$\\
$p$ - kara procentowa za dodanie jednego współczynnika do modelu
